using UnityEngine;
using UnityEngine.Events;
//商店管理员类

// 需要附加UniqueID组件方可使用
[RequireComponent(typeof(UniqueID))]
public class ShopKeeper : MonoBehaviour, IInteractable
{
    // 商店所持有的物品列表
    [SerializeField] private ShopItemList _shopItemsHeld;

    [SerializeField] private ShopSystem _shopSystem;

    public static UnityAction<ShopSystem, PlayerInventoryHolder> OnShopWindowRequested;

    private string _id;// 商店管理员的唯一标识符
    private ShopSaveData _shopSaveData;// 商店保存数据

    private void Awake()
    {
        _shopSystem = new ShopSystem(_shopItemsHeld.Items.Count, _shopItemsHeld.MaxAllowedGold, _shopItemsHeld.BuyMarkUp, _shopItemsHeld.SellMarkUp);
        foreach (var item in _shopItemsHeld.Items)
        {
            // Debug.Log($"{item.ItemData.DisplayName}:{item.Amount}");
            _shopSystem.AddToShop(item.ItemData, item.Amount);//向商店添加物品
        }
        _id = GetComponent<UniqueID>().ID;// 获取商店管理员的唯一标识符
        _shopSaveData = new ShopSaveData(_shopSystem);// 创建商店保存数据对象
    }

    private void Start()
    {
        // 如果存档管理器中不包含该商店管理员的数据，则将其添加到存档管理器中
        if (!SaveGameManager.data._shopKeeperDictionary.ContainsKey(_id))
            SaveGameManager.data._shopKeeperDictionary.Add(_id, _shopSaveData);
    }
    private void OnEnable()
    {
        SaveLoad.OnLoadGame += LoadInventory;// 注册加载游戏事件时，调用加载物品方法
    }
    private void OnDisable()
    {
        // 取消注册加载游戏事件时，调用加载物品方法
        SaveLoad.OnLoadGame -= LoadInventory;
    }

    private void LoadInventory(SaveData data)
    {
        // 如果存档中不包含该商店管理员的数据，则直接返回
        if (!data._shopKeeperDictionary.TryGetValue(_id, out ShopSaveData shopSaveData)) return;
        // 将存档中的商店保存数据赋值给当前商店管理员
        _shopSaveData = shopSaveData;
        // 更新商店系统
        _shopSystem = _shopSaveData.ShopSystem;
    }

    // 当交互完成时触发的事件
    public UnityAction<IInteractable> OnInteractionComplete { get; set; }

    // 当与玩家进行交互时调用
    public void Interact(Interactor interactor, out bool interactSuccessful)
    {
        var playerInv = interactor.GetComponent<PlayerInventoryHolder>();
        if (playerInv != null)
        {
            // 触发商店窗口请求事件，并传递商店系统和玩家背包持有者
            OnShopWindowRequested?.Invoke(_shopSystem, playerInv);
            interactSuccessful = true;
        }
        else
        {
            interactSuccessful = false;
            Debug.LogError("没找到PlayerInventoryHolder");
        }
    }

    // 结束与玩家的交互
    public void EndInteraction()
    {
        //
    }
}

[System.Serializable]
public class ShopSaveData
{
    public ShopSystem ShopSystem;// 商店系统
    public ShopSaveData(ShopSystem shopSystem)
    {
        ShopSystem = shopSystem;
    }
}
